package com.example.administrator.yunniuusedcar.model.protocol;

import android.os.Message;

import com.example.administrator.yunniuusedcar.model.mode_benn.IHttpService;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

import org.json.JSONObject;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by USER2015 on 2017/12/15.
 */

public class BaseProtocol {
    public BaseProtocol() {
    }

    public IHttpService getService() {
        return RetrofitManager.getInstance().getService();
    }

    /**
     * Retrofit请求
     *
     * @param call Retrofit接口返回的Call对象
     * @param callback 请求回调
     * @param reqType 调用哪一个接口
     * @param clazz 请求数据后解析得到的javabean
     * @param what 用来区分请求的类型，例如：用来区分是列表的下拉还是上拉。
     * @param <T>
     */
    public <T> void enqueue(Call<JsonObject> call,
                            final IHttpCallback callback,
                            final int reqType,
                            final Class<T> clazz,
                            final int what) {
        // 调用get请求获取数据
        call.enqueue(new Callback<JsonObject>() {
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                try {
                    // 服务器返回的json字符串
                    String json = response.body().toString();
                    // System.out.println("-------json: " + json);

                    // 手动解析json字符串
                    JSONObject jsonObject = new JSONObject(json);
                    int status = jsonObject.getInt("status");

                    // 按接口文档： 1:响应成功，0：请求数据失败
                    if (status == 1) {
                        Gson gson = new Gson();
                        T bean = gson.fromJson(json, clazz);

                        if (callback != null) {   // 请求成功的回调
                            Message msg = new Message();
                            msg.what  = what;
                            msg.obj = bean;

                            callback.onHttpSuccess(reqType, msg);
                        }
                    } else {
                        String error = jsonObject.getString("error");
                        if (callback != null) {   // 请求失败的回调
                            callback.onHttpError(reqType, error);
                        }
                    }

                } catch(Exception e) {
                    e.printStackTrace();
                    // 请求出错
                    if (callback != null) {   // 请求失败的回调
                        callback.onHttpError(reqType, e.getMessage());
                    }
                }
            }

            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {
                if (callback != null) {   // 请求失败的回调
                    callback.onHttpError(reqType, t.getMessage());
                }
            }
        });
    }

    public <T> void enqueue(Call<JsonObject> call,
                            final IHttpCallback callback,
                            final int reqType,
                            final Class<T> clazz) {
        enqueue(call, callback, reqType, clazz, -1);
    }

    public interface IHttpCallback {
        /**
         * 请求成功
         *
         * @param reqType 区分调用的是哪一个接口
         * @param msg 请求成功后返回的javabean数据
         */
        void onHttpSuccess(int reqType, Message msg);
        /**
         * 请求失败
         *
         * @param reqType 区分调用的是哪一个接口
         * @param error 请求失败的原因
         */
        void onHttpError(int reqType, String error);
    }
}
